bitkeeper revision 1.1713.2.5 (42b2f7c3PDbPInUuxxYnJtABejaMCQ)
authordjm@kirby.fc.hp.com <djm@kirby.fc.hp.com>
Fri, 17 Jun 2005 16:18:11 +0000 (16:18 +0000)
committerdjm@kirby.fc.hp.com <djm@kirby.fc.hp.com>
Fri, 17 Jun 2005 16:18:11 +0000 (16:18 +0000)
More hyperprivop stuff
Signed-off-by: Dan Magenheimer <dan.magenheimer@hp.com>
xen/arch/ia64/asm-offsets.c
xen/arch/ia64/hyperprivop.S

index 4b019209d55ccafa72708276520214b0d32bc043..eae65ef0d675b30bae4862f68b3a8fd651cfc03c 100644 (file)
@@ -59,6 +59,7 @@ void foo(void)
        DEFINE(XSI_INCOMPL_REG_OFS, offsetof(vcpu_info_t, arch.incomplete_regframe));
        DEFINE(XSI_PEND_OFS, offsetof(vcpu_info_t, arch.pending_interruption));
        DEFINE(XSI_RR0_OFS, offsetof(vcpu_info_t, arch.rrs[0]));
+       DEFINE(XSI_TPR_OFS, offsetof(vcpu_info_t, arch.tpr));
        //DEFINE(IA64_TASK_BLOCKED_OFFSET,offsetof (struct task_struct, blocked));
        //DEFINE(IA64_TASK_CLEAR_CHILD_TID_OFFSET,offsetof (struct task_struct, clear_child_tid));
        //DEFINE(IA64_TASK_GROUP_LEADER_OFFSET, offsetof (struct task_struct, group_leader));
index 235c8322ebbb2aecbbd78e1240d3afd8602b1d55..2adad6ce229daf6a21190c861d49f4898af9de9e 100644 (file)
@@ -69,7 +69,6 @@ GLOBAL_ENTRY(fast_hyperprivop)
        cmp.ne p7,p0=r20,r0
 (p7)   br.spnt.many dispatch_break_fault ;;
 
-// hard to test, because only called from rbs_switch
        // HYPERPRIVOP_COVER?
        cmp.eq p7,p6=XEN_HYPER_COVER,r17
 (p7)   br.sptk.many hyper_cover;;
@@ -82,6 +81,14 @@ GLOBAL_ENTRY(fast_hyperprivop)
        cmp.eq p7,p6=XEN_HYPER_RSM_DT,r17
 (p7)   br.sptk.many hyper_rsm_dt;;
 
+       // HYPERPRIVOP_GET_TPR?
+       cmp.eq p7,p6=XEN_HYPER_GET_TPR,r17
+(p7)   br.sptk.many hyper_get_tpr;;
+
+       // HYPERPRIVOP_SET_TPR?
+       cmp.eq p7,p6=XEN_HYPER_SET_TPR,r17
+(p7)   br.sptk.many hyper_set_tpr;;
+
        // if not one of the above, give up for now and do it the slow way
        br.sptk.many dispatch_break_fault ;;
 
@@ -455,7 +462,6 @@ ENTRY(hyper_cover)
        rfi
        ;;
 
-#if 1
 // return from metaphysical mode (meta=1) to virtual mode (meta=0)
 ENTRY(hyper_ssm_dt)
 #ifdef FAST_HYPERPRIVOP_CNT
@@ -526,4 +532,60 @@ ENTRY(hyper_rsm_dt)
        mov pr=r31,-1 ;;
        rfi
        ;;
+
+ENTRY(hyper_get_tpr)
+#ifdef FAST_HYPERPRIVOP_CNT
+       movl r20=fast_hyperpriv_cnt+(8*XEN_HYPER_GET_TPR);;
+       ld8 r21=[r20];;
+       adds r21=1,r21;;
+       st8 [r20]=r21;;
 #endif
+       mov r24=cr.ipsr
+       mov r25=cr.iip;;
+       adds r20=XSI_TPR_OFS-XSI_PSR_IC_OFS,r18 ;;
+       ld8 r8=[r20];;
+       extr.u r26=r24,41,2 ;;
+       cmp.eq p6,p7=2,r26 ;;
+(p6)   mov r26=0
+(p6)   adds r25=16,r25
+(p7)   adds r26=1,r26
+       ;;
+       dep r24=r26,r24,41,2
+       ;;
+       mov cr.ipsr=r24
+       mov cr.iip=r25
+       mov pr=r31,-1 ;;
+       rfi
+       ;;
+END(hyper_get_tpr)
+
+// if we get to here, there are no interrupts pending so we
+// can change virtual tpr to any value without fear of provoking
+// (or accidentally missing) delivering an interrupt
+ENTRY(hyper_set_tpr)
+#ifdef FAST_HYPERPRIVOP_CNT
+       movl r20=fast_hyperpriv_cnt+(8*XEN_HYPER_SET_TPR);;
+       ld8 r21=[r20];;
+       adds r21=1,r21;;
+       st8 [r20]=r21;;
+#endif
+       mov r24=cr.ipsr
+       mov r25=cr.iip;;
+       movl r27=0xff00;;
+       adds r20=XSI_TPR_OFS-XSI_PSR_IC_OFS,r18 ;;
+       andcm r8=r8,r27;;
+       st8 [r20]=r8;;
+       extr.u r26=r24,41,2 ;;
+       cmp.eq p6,p7=2,r26 ;;
+(p6)   mov r26=0
+(p6)   adds r25=16,r25
+(p7)   adds r26=1,r26
+       ;;
+       dep r24=r26,r24,41,2
+       ;;
+       mov cr.ipsr=r24
+       mov cr.iip=r25
+       mov pr=r31,-1 ;;
+       rfi
+       ;;
+END(hyper_set_tpr)